package com.laker.autotest.webui.page.baidu;

import com.laker.autotest.webui.core.BasePage;
import com.microsoft.playwright.ElementHandle;
import com.microsoft.playwright.Locator;
import com.microsoft.playwright.Page;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * https://playwright.dev/java/docs/pom
 * 页面对象模型，目的是为了代码维护方便。
 * 以搜索功能为例，搜索页面需要存放元素定位和控件操作行为。
 * baidu 首页
 * 在 Playwright 中，"对象页面模式"（Object Page Pattern）是一种设计模式，它用于将页面的各个功能和行为封装到单独的对象中，
 * 使代码更模块化、可维护性更强。这种模式通常用于自动化测试框架，其中每个页面或组件都由一个独立的类来表示，提供访问和操作页面元素的方法。
 * </p>
 */
@Slf4j
public class BaiduHomePage extends BasePage {
    private final Locator searchTermInput;
    private final String pageResultRow = ".c-title.t.t.tts-title";

    public BaiduHomePage(Page initPage) {
        super(initPage);
        searchTermInput = getComponentById("kw");
    }

    @Override
    protected String initUrl() {
        return "https://www.baidu.com";
    }


    public void search(String searchTerm) {
        searchTermInput.click();
        searchTermInput.fill(searchTerm);
        searchTermInput.press("Enter");
    }

    public List<String> getSearchResultRowTitles() {
        List<String> results = new ArrayList<>();
        // 获取搜索结果 每行数据的标题
        // 这种异步加载的不宜在构造函数初始化，因为那时获取的元素还没有完全加载完成，需要在方法中获取
        // 等待选择器解析为单个元素或超时（默认超时时间为30秒）
        page.waitForSelector(pageResultRow);
        List<ElementHandle> searchResults = page.querySelectorAll(pageResultRow);
        for (ElementHandle result : searchResults) {
            log.info("search row title:{}", result.innerText());
            results.add(result.innerText());
        }
        return results;
    }

}
